package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// 全局变量
var ticket = 10 // 100张票

// 用上锁的方法
var wg sync.WaitGroup // 同步等待组对象
// 创建锁头
var matex sync.Mutex

func main() {
	wg.Add(4)
	go saleTickets("售票口1")
	go saleTickets("售票口2")
	go saleTickets("售票口3")
	go saleTickets("售票口4")

	//WaitGroup 可以顶替time.Sleep(5*time.Second)作用，实现主 goroutine
	//等待一组子 goroutine 完成任务的功能，确保程序的并发执行逻辑正确。
	wg.Wait() // main要等待。。。
	//time.Sleep(5*time.Second)
}

func saleTickets(name string) {
	rand.Seed(time.Now().UnixNano())
	// 通知 WaitGroup 该 goroutine 已经完成任务
	defer wg.Done()
	for {
		matex.Lock()
		if ticket > 0 {
			intn := rand.Intn(1000)
			fmt.Println("随机数：", intn)
			time.Sleep(time.Duration(intn) * time.Millisecond)
			fmt.Println(name, "售出：", ticket)
			ticket--
		} else {
			matex.Unlock() //解锁
			fmt.Println(name, "售罄，没有票了。。")
			break
		}
		matex.Unlock()
	}
}
